package com.example.websocket.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

//@Configuration
//@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
    // 参考 https://docs.springjava.cn/spring-framework/reference/web/websocket/stomp/handle-broker-relay.html

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/portfolio").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 使用 RabbitMQ 或类似消息代理启用 STOMP 代理中继。
        registry.enableStompBrokerRelay("/topic", "/queue")
                .setRelayHost("localhost")  // 设置为消息代理的实际主机。
                .setRelayPort(61613);       // 设置为消息代理的实际端口。
        
        // 将特定于应用程序的目标设置为使用 “/app” 前缀。
        registry.setApplicationDestinationPrefixes("/app");
    }
}

// 内置的简单消息代理处理来自客户端的订阅请求，将它们存储在内存中，并将消息广播到连接的具有匹配目标的客户端。代理支持路径样式的目标，包括对 Ant 样式目标模式的订阅。
// 简单的代理非常适合入门，但仅支持 STOMP 命令的一个子集（它不支持确认、回执和其他一些功能），依赖于简单的消息发送循环，并且不适合集群。作为替代方案，您可以升级您的应用程序以使用功能齐全的消息代理。
//请参阅您选择的消息代理的 STOMP 文档（例如 RabbitMQ、ActiveMQ 等），安装代理，并在启用 STOMP 支持的情况下运行它。然后，您可以在 Spring 配置中启用 STOMP 代理中继（而不是简单代理）。